<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Base HTML</title>
</head>
<body>
    
</body>
</html>

<script>
    console.log("Hello World");

    var a = 1;
    a = 11
    console.log(a);

    const b = 2;
    console.log(b);

    let c = 3;
    console.log(c);

    const obj = {
        name: "John", age: 30
    };
    obj.name = "Doe";
    console.log(obj);

    var A = 'A'
    console.log(A);

    let firstName = "John";
    let lastName = "Doe";
    let fullName = firstName + " " + lastName;
    console.log(fullName);
    console.log("------------------------------------------------------------")

    //函数由关键字 function 定义，函数名是 myFunction，函数体是花括号 {} 内的代码块。
    function myFunction() {
        console.log("dome函数");
    }
    myFunction();

    //函数表达式（存储在变量中）
    let fn = function () {
        console.log("函数表达式")
    }
    fn();

    // console.log(x);
    // var x = 10;  //变量提升
    // console.log(x);

    text();
    function text () {
        console.log("函数提升")
    }

    fn2();
    var fn2 = "这是一个fn2变量"
     function fn2 () {
        console.log("fn2函数")
    }
    console.log(fn2)

    // 函数重构
    function sum(a,b) {
        console.log(a + b)
    }
    sum(1,2) //返回 1*2 = 2
    //函数提升
    function sum(a,b) {
        console.log(a*b)
    }
    sum(3,2) //返回 3*2 = 6

    //使用return语句从函数返回值，位于return语句之后的任何代码都永远不会执行
    function getsum(a,b) {
        return a + b;
    }
    console.log(getsum(3,5))

    function getAll () {
        return a;
        var a = 1;
        // let a = 1;
    }
    /*
        1.return a，在a没有被赋值的情况下，会返回undefined 
        2.var a = 1，因为return语句之后的任何代码都永远不会执行，所以a不会被赋值
        3.let a = 1，let声明的变量不会被提升，所以a会报错
    */
    console.log(getAll()) 

    //函数参数设置默认值
    function demo1(val = 2, str = '2'){
        console.log(val + str)
    }
    demo1() //返回 22
    demo1(3) //返回 32
    demo1(3,'3') //返回 33

    //函数参数总数获取
    function demo2(a,b,c,d) {
        console.log(a,b)
    }
    console.log(demo2.length) //返回 4，因为a和b是参数，c和d是多余的参数，所以返回4

    //函数参数解构
    function demo3({a = 3,b,c,d}) {
        console.log(a)
    }
    console.log(demo3.length) //返回 1，因为a和b是参数，c和d是多余的参数，所以返回1

    //不定参数
    function demo4(...args) {
        console.log(args)
    }
    demo4();//返回一个空数组
    demo4(1,2,3);//返回一个数组，数组元素为1,2,3
    demo4(3,true);
    demo4(3,true,{a:1,b:2});//返回一个数组，数组元素为3,true,{a:1,b:2}
</script>